package cn.iocoder.yudao.module.mon.service.impl;

import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
import cn.iocoder.yudao.module.mon.controller.admin.mon.vo.AddDeviceReqVo;
import cn.iocoder.yudao.module.mon.controller.admin.mon.vo.DeleteDeviceReqVo;
import cn.iocoder.yudao.module.mon.controller.admin.mon.vo.UpdateDeviceReqVo;
import cn.iocoder.yudao.module.mon.ext_service.ys7_service.Ys7ExtService;
import cn.iocoder.yudao.module.mon.mappper.ExtEntityMapper;
import cn.iocoder.yudao.module.mon.service.MonService;
import cn.iocoder.yudao.module.mon.vo.reponse.Ys7GetDeviceInfoResVo;
import cn.iocoder.yudao.module.mon.vo.request.Ys7AddDeviceReqVo;
import cn.iocoder.yudao.module.mon.vo.request.Ys7DeleteDeviceReqVo;
import cn.iocoder.yudao.module.mon.vo.request.Ys7GetDeviceInfoReqVo;
import cn.iocoder.yudao.module.mon.vo.request.Ys7UpdateNameDeviceReqVo;
import cn.iocoder.yudao.module.mon_platform.controller.admin.ys7deviceinfo.vo.Ys7DeviceInfoCreateReqVO;
import cn.iocoder.yudao.module.mon_platform.dal.dataobject.ys7deviceinfo.Ys7DeviceInfoDO;
import cn.iocoder.yudao.module.mon_platform.enums.Ys7ErrorCodeConstants;
import cn.iocoder.yudao.module.mon_platform.service.ys7deviceinfo.Ys7DeviceInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
@Slf4j
public class MonServiceImpl implements MonService {
    /**
     * 第三方服务API
     */
   @Resource
    private Ys7ExtService ys7ExtService;
    /**
     * 本地服务
      */
   @Resource
    private Ys7DeviceInfoService ys7DeviceInfoService;


    /**
     * 绑定监控设备
     * 绑定
     * 修改名称
     * 获取信息
     * 录入数据库和房子绑定
     *
     * @param context param
     */
    @Override
    public Long addDeviceInfo(AddDeviceReqVo context) {
        // 查询设备信息
        Ys7GetDeviceInfoReqVo ys7GetDeviceInfoReqVo = new Ys7GetDeviceInfoReqVo();
        ys7GetDeviceInfoReqVo.setDeviceSerial(context.getDeviceSerial());
        Ys7GetDeviceInfoResVo deviceInfo = ys7ExtService.getDeviceInfo(ys7GetDeviceInfoReqVo);

        Ys7AddDeviceReqVo ys7AddDeviceReqVo = new Ys7AddDeviceReqVo();
        // 设备序列号
        ys7AddDeviceReqVo.setDeviceSerial(context.getDeviceSerial());
        // 设备验证码
        ys7AddDeviceReqVo.setValidateCode(context.getValidateCode());
        // 向平台绑定设备  异常则抛错
        ys7ExtService.addDeviceInfo(ys7AddDeviceReqVo);

        // 绑定成功  修改失败 捕获异常
        // 判断名称是否有值 有值则调用修改设备名称接口
        if(StrUtil.isNotEmpty(context.getDeviceName())){
            try{
                Ys7UpdateNameDeviceReqVo ys7UpdateNameDeviceReqVo
                        = new Ys7UpdateNameDeviceReqVo();
                ys7UpdateNameDeviceReqVo.setDeviceSerial(context.getDeviceSerial());
                ys7UpdateNameDeviceReqVo.setDeviceName(context.getDeviceName());
                ys7ExtService.updateDeviceName(ys7UpdateNameDeviceReqVo);
            }catch(Exception e){
                e.printStackTrace();
              log.error(" 修改设备名称 异常 %s",e.getMessage());
            }

        }
        


        // 保存设备信息
        Ys7DeviceInfoCreateReqVO ys7DeviceInfoDb
                = ExtEntityMapper.INSTANCE.toYs7DeviceInfoDbEntity(deviceInfo);
        // houseId 赋值
        ys7DeviceInfoDb.setHouseId(context.getHouseId());
        ys7DeviceInfoDb.setValidateCode(context.getValidateCode());
        // 前端上送设备名称 则按前端名称保存(因为前面修改了名称 可能查询回来就是 设置的名称)
        if(StrUtil.isNotEmpty(context.getDeviceName())){
            ys7DeviceInfoDb.setDisplayName(context.getDeviceName());
        }
        // 保存 设备信息
        Long id = ys7DeviceInfoService.createYs7DeviceInfo(ys7DeviceInfoDb);
        return  id;
    }

    /**
     * 修改监控设备
     *
     * @param context param
     */
    @Override
    public void updateDeviceInfo(UpdateDeviceReqVo context) {
       // 根据id查询设备信息
        Ys7DeviceInfoDO ys7DeviceInfo = ys7DeviceInfoService.getYs7DeviceInfo(context.getId());
        // 判断输入的设备id 是否有信息
        if (ys7DeviceInfo  == null) {
            throw ServiceExceptionUtil.exception(Ys7ErrorCodeConstants.YS7_DEVICE_INFO_NOT_EXISTS);
        }
        // 校验设备所属项目 与输入项目是否一致  不一致则报错
        if(ys7DeviceInfo.getHouseId().equals(context.getHouseId())){
            throw ServiceExceptionUtil.exception(Ys7ErrorCodeConstants.YS7_HOUSE_ID_NOT_EQUALE_DB_ID);
        }

        // 修改Ext设备名称
        Ys7UpdateNameDeviceReqVo updateNameDeviceReqVo = new Ys7UpdateNameDeviceReqVo();
        updateNameDeviceReqVo.setDeviceName(context.getDeviceName());
        updateNameDeviceReqVo.setDeviceSerial(ys7DeviceInfo.getSubSerial());
        ys7ExtService.updateDeviceName(updateNameDeviceReqVo);

        // 修改DB设备名称
        ys7DeviceInfo.setDisplayName(context.getDeviceName());
        ys7DeviceInfoService.updateYs7DeviceInfo(ys7DeviceInfo);
    }

    /**
     * 删除监控设备
     *
     * @param context param
     */
    @Override
    public void deleteDeviceInfo(DeleteDeviceReqVo context) {
        // 根据id查询设备信息
        Ys7DeviceInfoDO ys7DeviceInfo = ys7DeviceInfoService.getYs7DeviceInfo(context.getId());
        // 判断输入的设备id 是否有信息
        if (ys7DeviceInfo  == null) {
            throw ServiceExceptionUtil.exception(Ys7ErrorCodeConstants.YS7_DEVICE_INFO_NOT_EXISTS);
        }
        // 校验设备所属项目 与输入项目是否一致  不一致则报错
        if(!String.valueOf(ys7DeviceInfo.getHouseId()).equals(String.valueOf(context.getHouseId()))){
            throw ServiceExceptionUtil.exception(Ys7ErrorCodeConstants.YS7_HOUSE_ID_NOT_EQUALE_DB_ID);
        }
        // 先调用 第三方平台删除服务
        Ys7DeleteDeviceReqVo deviceReqVo = new Ys7DeleteDeviceReqVo();
        deviceReqVo.setDeviceSerial(ys7DeviceInfo.getSubSerial());
        deviceReqVo.setValidateCode(ys7DeviceInfo.getValidateCode());
        ys7ExtService.deleteDeviceInfo(deviceReqVo);

        // 删除本地设备信息
//        ys7DeviceInfo.setDeleted(true);
        ys7DeviceInfoService.deleteYs7DeviceInfo(ys7DeviceInfo.getId());
    }

    /**
     * 获取缓存token
     *
     * @return String
     * @throws
     * @author Annie
     * @time 2023/8/7 10:50
     */
    @Override
    public String getTokenCache() {
        return ys7ExtService.getAccessTokenCache();
    }

}
